import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header  # 用于附件名支持中文
import os

def sendEmail(msg_from, passwd, subject, msg_to, content, 
              file_path='', file_name=''):
    """
    发送邮件函数，可发送文本邮件，也可附加附件
    参数说明：
    - msg_from: 发件人邮箱
    - passwd: 发件人邮箱授权码
    - subject: 邮件主题
    - msg_to: 收件人邮箱（字符串）
    - content: 邮件正文内容
    - file_path: 附件路径（默认为空表示无附件）
    - file_name: 附件名称（显示给收件人的名称）
    """

    # 创建一个带附件的邮件对象
    message = MIMEMultipart()
    message['Subject'] = subject
    message['From'] = msg_from
    message['To'] = msg_to

    # 添加邮件正文（纯文本）
    message.attach(MIMEText(content, 'plain', 'utf-8'))

    # 如果指定了附件路径，则添加附件
    if file_path:
        try:
            with open(file_path, 'rb') as f:
                # 创建MIME对象，附件内容以base64编码
                att = MIMEText(f.read(), 'base64', 'utf-8')
                att['Content-Type'] = 'application/octet-stream'
                # 添加附件头信息，支持中文文件名
                att.add_header("Content-Disposition", "attachment", 
                               filename=(Header(file_name, 'utf-8').encode()))
                message.attach(att)
        except FileNotFoundError:
            print(f"错误：找不到附件文件 {file_path}")
            return
        except Exception as e:
            print(f"读取附件时发生错误: {e}")
            return

    try:
        # 连接QQ邮箱SMTP服务器（使用SSL）
        server = smtplib.SMTP_SSL('smtp.qq.com', 465)
        server.login(msg_from, passwd)  # 登录邮箱
        server.sendmail(msg_from, msg_to, message.as_string())  # 发送邮件
        server.quit()
        print("发送成功!")
    except smtplib.SMTPAuthenticationError:
        print("认证失败，请检查邮箱地址和授权码是否正确。")
    except smtplib.SMTPConnectError:
        print("连接SMTP服务器失败。")
    except smtplib.SMTPException as e:
        print(f"发送失败，SMTP异常: {e}")
    except Exception as e:
        print(f"发送失败，其他异常: {e}")


# 发件人邮箱及授权码（请使用你自己的）
msg_from = 'xxxxxxxxx@qq.com'  # 发件人邮箱
passwd = 'xxxxxxxxxxxxxxxx'    # QQ邮箱授权码

# 公共邮件信息
subject = '校庆邀请函'
msg_to = 'xxxxxxxxxx@qq.com'  # 收件人邮箱
content = 'XX校友您好，诚邀您参加65周年校庆，附件是邀请函，请您查收'

# 1. 发送不带附件的邮件
sendEmail(msg_from, passwd, subject, msg_to, content)

# 2. 发送带附件的邮件
file_path = './校友邀请函.docx'
file_name = '校友邀请函.docx'  # 附件文件名必须包含扩展名
sendEmail(msg_from, passwd, subject, msg_to, content, file_path, file_name)
